<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="../js/vue.js"></script>
    <style>
        /* #app{}
        [id="app"]{} */

        /* 属性选择器 */
        /* [属性名="属性值"]{

        } */

        /* 如果元素中存在v-cloak 属性 默认隐藏., 等Vue实例准备完毕, 自定删除该属性 */
        [v-cloak]{
            display: none;
        }

        p {
            height: 40px;
            line-height: 40px;
            border: 1px dashed #333;
        }
    </style>
</head>

<body>
    <!-- <div  onclick="alert(hello)">123123</div>
    <div  onclick="alert('hello')">123123</div> -->


    <div id="app" v-cloak>
        <!-- 文本插值 一般放在标签对内,作为文本内容 -->
        <p>{{msg}}</p>
        <p v-once>{{msg}}</p>
    </div>
</body>
<script>
    /* 
        Vue.js 使用了基于 HTML 的模板语法，允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据。所有 Vue.js 的模板都是合法的 HTML，所以能被遵循规范的浏览器和 HTML 解析器解析。


        文本插值  {{ xxx }}    一般用在标签对内, 对象属性名将data中 对应属性名 的 属性值 渲染到标签内 (查询范围应该是当前Vue实例)
            1.文本插值中可以放变量(从data中查找) =>   不同类型的数据,在文本插值中展示的结果可能不一样 
                string number boolean  直接输出
                null undefined 会输出空字符串("")
                array object 会先转化为JSON字符串 (JSON.stringify()) ,再输出 

            2. 文本插值中可以放javascript表达式(算术表达式 关系表达式 逻辑表达式)   => 先求解表达式的结果,再将结果拼接到模板中
            3. 文本插值中可以调用方法  => 先调用方法,在将方法的返回值拼接到模板中
            4. 文本插值中可以进行简单的判断(三目运算符)  => 先判断,再将判断的结果拼接到模板中


           小结:  最终都是将输出的结果,拼接到模板中



        指令: 指令 (Directives) 是带有 v- 前缀的特殊 attribute。指令 attribute 的值预期是单个 JavaScript 表达式 (v-for 是例外情况，稍后我们再讨论)。指令的职责是，当表达式的值改变时，将其产生的连带影响，响应式地作用于 DOM

            a. 指令 (Directives) 是带有 v- 前缀的特殊 attribute(属性 => html属性,写在标签<>以内,作为标签内的属性)
            b. 指令 attribute 的值预期是单个 JavaScript 表达式 (可以是变量 表达式 方法 三目运算符),指令值一般会被""包裹,但是不意味着指令值一定是字符串
            c. 指令的职责是，当表达式的值改变时，将其产生的连带影响，响应式地作用于DOM (操作DOM => 修改内容 修改属性 修改样式  绑定事件  元素增删改)

        指令的常见用法: 
            v-指令名称        
                部分指令不需要指令值

            v-指令名称 = "指令值"   
                如: v-html  v-text  v-if  v-else  v-else-if  v-show

            v-指令名称:参数 = "指令值"
            v-指令名称:参数.修饰符 = "指令值"

        常见指令:
            v-html="xxx"  设置DOM元素的html结构(标签+文本) (将指令的值作为html结构输出到标签内)
            v-text="xxx"  设置DOM元素的文本结构(只有文本) (将指令的值作为html结构输出到标签内)

            v-pre      禁用文本插值, 此时标签内的{{}} 不会作为文本插值解析,而是作为普通文本输出
            v-cloak    需要配合css属性选择器使用( 等Vue实例准备完毕之前默认隐藏), 等Vue实例准备完毕(声明式渲染)之后在显示
            v-once     只渲染元素和组件一次, 即便后续数据更新, 也不会重新渲染
    
    */

    // v-once
    var vm = new Vue({
        el: "#app",
        data: {
            msg: "hello world",
            count: 100,
            bool: true,
            a: null,
            b: undefined,
            list: [1, 4, 7, 2, 5, 8, 3, 6, 9],
            obj: { a: 1, b: 2, c: 3 }
        },
        methods: {
            reverseMsg() {
                return this.msg.split("").reverse().join(""); //方法返回 反转后的新字符串
            }
        }
    })


    setTimeout(()=>{
        vm.msg = "hello Vue";
    },2000);


</script>

</html>